私がプログラミングを好きなのは、探求心と創造性を満たしてくれるからです。
Yahoo 知恵袋のグレードが上がりました。グイーン。
グレード16
↓ ↓ ↓
グレード17
となりました。
… 今の私のコンピューター関係のスキルを活かした一種の仕事みたいなものが、コレ↑しかないとすれば、私が今までコンピューター関係で頑張ってきたのは、このためだったのか?? なんて思います。
49歳ですからね。このためだったんでしょう。?
最近私の回答がベストアンサーになった知恵袋:
ベストアンサーをもらえるかどうかはあまり気にしないように心がけていて、『役に立ったかどうか』というそれだけを考えるようにしています。
なので、言葉で返事があるかどうか、「いいね」的なボタンをどれだけ押されたか、というその辺を注目するようにしています。
とはいえ、ベストアンサーもらえると正直嬉しいんですよね。
オークションにて、エミュレータ用に「IBM PC-DOS J6.1/V」という OS を買いました。(5,000 円でした)
写真はパッケージの表裏です。未開封なんですよね。
正しくは「競り落としました」と言うべきかもしれませんが、入札は私だけで、誰とも競っていませんので。。
「買いました」という感覚です。
なぜ PC-DOS を購入したのかというと…
「はじめて読む486」(30年前に刊行され、現在でも人気がある)という本のサンプルプログラム(17本)が、FreeDOS という互換 OS のもとではその一部しか動作しません。
一部しか動作しないという状況では、本を読んで学ぶ意欲も薄れてしまいます。
そこで、『互換ではない本家の IBM PC-DOS ではどう動くのか』と思って、今回買うに至りました。
もし、本家 IBM PC-DOS で同書の想定の通りに問題なくすべてのサンプルプログラムが動くのなら、互換である FreeDOS に何か問題があるということになりますよね。
現在、無料で使える DOS は FreeDOS しかないので、ここはしっかり結論しておきたいところです。
ところで、「MS-DOS 4.0」もこの前、オープンソース(無料)化されましたが、「MS-DOS 起動ディスク」が無いので本当の MS-DOS の環境が作れません。
起動ディスク。ありません。
MS-DOS や PC-DOS、FreeDOS などの「DOS」は、
『すでにある環境で sys.com というコマンドを使って DOS のシステムを新しい環境(ディスク)にコピーする』
という方法で環境を作るので、MS-DOS 起動ディスクは絶対に必要になります。無いと環境は作れません。
オープンソース化されて、出来ることは、FreeDOS の環境下で MS-DOS 4.0 の command.com を実行するくらいです。
起動ディスクさえあれば、MS-DOS も本家の一つなので、オークションで PC-DOS を買うこともなかった、、と言えます。
でも、PC-DOS がどう動き、サンプルプログラムがどう実行されるのかは楽しみです。
そして、未開封の PC-DOS パッケージを開封して、「1枚のディスク」をエミュレーターに入れました。
同梱のディスクやマニュアル類をご確認ください、という書類にはこう書かれています。
▼インストーラーが起動しました。
軽快にインストールは進みましたね。でも、
▼「DISK 2 を入れてください」だって?? ディスクは1枚しかないんだけど…??
なんだよ、DISK 2って…嫌な予感…。もしかしてあれか?
▼これか?「プリロード用」。
なんだ? "OS パッケージにおけるプリロード" って?
「プリロード」を直訳すると、「事前にロード」。
OS を事前にロードしてある場合のパッケージ。
つまり、パソコンに OS を「プリインストール」して出荷しているパソコンのための、別途用意してあるパッケージ。
だからディスク1枚です?インストールは途中までで進めません?
意味がわかんないんだけど…
いろいろ調べてマニュアルを見ると、、
▼インストーラーコマンド(setup.exe)のオプション。
そうか…、つまりプリインストールされている OS に問題が起こったときに救済するためのツールとしてのパッケージ、、かな?
そのためのツールはディスク1に入っているので、ディスク1しかありません。
そういう意味のプリロード(プリインストール)用です。
ってこと?…ガッカリ…5,000 円だったんだけど… orz
『立派な OS がディスク1枚だなんて、シンプルだな。でも MS-DOS 3.3B とかもディスク3枚で主に使うのは1枚目だけだったから、同じようなものか…』と何となく思っていましたが、そこが落とし穴だったんですね。
”ちょっとでもおかしいと思ったら手を挙げるように” と仕事でも言われていますが、見過ごしましたね。
でも、、
▼インストールを中断して、インストール先のハードディスク(ハードディスクイメージファイル)を起動すると、起動できました。
目的はこれ↑だったので、なんとか OK かな…。
(せっかくの「IBM PC-DOS J6.1/V」だと思ったのに、機能限定か。。景気悪いなぁ)
上記の黒い画面に、International Bussiness Machines と書いてあって、どこの会社だ?と思ったら、頭文字を取って IBM なんですね。IBM が Microsoft に DOS の開発を頼んだ、というのは有名な話で、ちゃんと Microsoft の表示も入っていますね。
今日は会社を休んで、「税金の帳簿作成とその記帳方法」の説明会に出席してきました。
私が描いたイラストが少し売れており、売れているということは、人々から消費税を受け取っている、ということになります。
国に代わって受け取った消費税は、ちゃんと国に納めなければなりません。
↓私が描いたこういう感じのイラスト群が、、
↓こんな感じで売れています。
↑このグラフから、「1カ月かかって600円くらい売り上げた」という結果が読み取れます。
…1カ月600円でどうやって生活するのか??
売り上げが 1,000 万円以下ならその消費税の納税義務はありません。
私のイラストの売り上げが年間 1,000 万円を超えることはまずないので、永遠に消費税の納税義務はないでしょう。
それなのに、どうして「税金の帳簿作成とその記帳方法」を学ぶ必要があるのか。
何か物を売る人を「事業者」と言います。
事業者には2種類あって、それは「適格請求書発行事業者」(課税事業者)と、「免税事業者」です。
この「免税事業者」というのが、売り上げが年間 1,000 万円以下で消費税の納税の義務がない人のことです。
私がその「免税事業者」だったんですが、「免税事業者」は、
”将来、売り上げが衰退する恐れがある”
と現在説明されています。
「それは良くないな」と思って、私は「適格請求書発行事業者」の登録手続きを取ることにしました。
「免税事業者」から「適格請求書発行事業者」になると、消費税の納税義務が発生します。
それで私にも「税金の帳簿作成とその記帳方法」を学ぶ必要が出てきたわけです。
ところで、適格請求書の発行とは、具体的にこういうことです。
ニューデイズでお茶を買いましたが、そのレシートに T00000… という番号が明記されています。(赤下線部)
これがまぁ、「適格請求書」です。
何が「適格」なのかというと、レシート(領収書、請求書)に、”国に届け出をしてあることを示す登録番号” があることと、消費税を細かく適正に書いていることが、(国税庁にとって)「適格」だということ。。。だと思います。
この登録番号を、国税庁の「適格請求書発行事業者公表サイト」で検索すると、
このようにその業者の登録が出てきます。
ニューデイズは JR がやってるコンビニなので、JR の情報が出てきます。
そして、私も「適格請求書発行事業者」の手続きを取ったということで、私の登録番号を入力すると、、、
私の名前が出てきます。ニューデイズと並びましたね。並んでないか。
私もイラストを売って、買い手に領収書(レシート)を発行するときに、登録番号と消費税額をその領収書に書いて「適格請求書」として渡すことができます。
以下は少し難しいことを言っています。
商品を売るとき(たとえば私のイラストを買った事業者がそのイラストを元にして何か商品を売るとき)、売るために購入した素材(イラスト)の価格(原価)の消費税(納税)をそのままにしてしまうと、その商品の価格には原価がもちろん含まれていて、その価格に対して 10 %の消費税をかけて売り、売上金の中からその消費税を納税するので、消費税を二重に納税していることになってしまいます。
それを避けるために、素材を買うのにかかった消費税の分を、売り上げの消費税の納税から差し引いて良いとしたものが「仕入税額控除」というもので、その控除を受けるために「適格請求書」(素材購入時に受け取る)が必要になるんですね。
私が免税事業者のままだとその適格請求書を発行できません。
(免税事業者は適格請求書を発行できないことになっています)
すると買い手の「事業者」は、適格請求書を発行できない私からだんだん離れていきます。
免税事業者から素材を買うと、二重に税金を払うことになりますからね。
繰り返しになりますが、免税事業者は、
”将来、売り上げが衰退する恐れがある”
私のイラストを買ってくれる人が減る。ということで、それで説明会に出席してきました。
描いたイラストでお小遣いをもらい続けたいので~
…あと、10年前から事業者になることを、おぼろげながら、夢見てきたところもあり、
私が想定するきちんとした事業の最初の一歩みたいなところが見えた気がして、この手続きを行うことはちょっと嬉しいところがありました。
最近は、「はじめて読む486」という 30 年前の書籍のサンプルプログラムを正常動作させるための調査に、自由な時間の8割を使っています。
「はじめて読む486」のサポートサイト(リンク)で提供されているサンプルプログラムの、バイナリファイル(.exe)の動作についてはほぼ解決しました(すべてのサンプルが動くようになりました)が、ソースコードのほうをコンパイル/アセンブルして自分でバイナリファイル(.exe)を作った場合の動作についてはまだ解決していません。
自分で作ったバイナリファイルを実行すると問題なく実行されますが、その後に「特定のソフトウェア」を実行するとその特定のソフトウェアがフリーズします。
具体的には、サンプルプログラムの内、OS の機能としてタスクスイッチ(OS上で複数動いているアプリケーションを切り替える動作)を行うサンプルプログラムは実行後、上記の症状が出るようです。
そして「フリーズする特定のソフトウェア」とは、たぶんですが、DOS上で「リアルモード」から「プロテクトモード」へ移行して処理を行うタイプのソフトウェアだと思います。
たとえば、OpenWatcom の wasm.exe です。
左上図の通りプロテクトモードで動作すると書かれていて、サンプルプログラム実行後にこれを起動しようとすると、フリーズします。
サンプルプログラムを編集して、アセンブルして、、という利用の仕方は十分にありえるので、直したいんです。
ところで、「リアルモード」とは古いタイプの CPU 動作モードで、「プロテクトモード」は現代の core シリーズに通じるような新しいタイプの CPU 動作モードです。(新しいとはいえ、登場してから 30 年以上経っていますが…)
新しいタイプの CPU が登場したときに、それまでの古いタイプの CPU との互換性を維持するために用意されたのが「リアルモード」です。
たぶん、サンプルプログラムが OS の機能を試そうとしていろいろ設定を行って、その設定が不正に残っていることが原因で、後に続いて起動するプロテクトモードを利用するソフトウェアでつまづく結果になっている…、と思うんです。
以下は「こんなことを最近やってますよ」という意味での画像掲載です。
左上図は「Oracle VirtualBox」の仮想コンピューター上にこの前オークションで買った「PC-DOS」をインストールし、「OS 機能を試すサンプルプログラム」の一部「TASK.C」を見ているところです。
画面はテキストエディタですが、FreeDOS という PC-DOS の互換 OS に付属していたものをコピーして使用しています。
同書では主に C 言語を使用して OS 機能を実現しようとしていますが、一部の機能はどうしてもアセンブリ言語を使用する必要があるとのことで、アセンブリ言語のソースコードもあります。(左上図)
同書(のサポートサイト)では C 言語もアセンブリ言語も OpenWatcom の使用を勧めていますが、それだとアセンブリ言語のプログラムがまともに動きません。
だから、Windows 上でアセンブリ言語のソースコードを編集し、、、
編集したら、Windows 用の「GUI Turbo Assembler」という「Borland Turbo Assembler」(TASM)由来のアセンブラを使って、編集したソースコードをアセンブルします。
Watcom のアセンブラだとダメですが、TASM だとサンプルプログラムはちゃんと動作するようになるんです。(長い調査のすえにやっとで突き止めた事実です)
しかし、動作した後に、最初に書いた通り、特定の「プロテクトモードで動作するソフトウェア」を起動するとフリーズします。(現在進行中の新たな調査です)
こんなふうに Excel で図を描いて、サンプルプログラムの動きを把握しようとしています。
問題はどこにあるのかなぁと思って。
そうやって原因を探っていると、「はじめて読む486」が教えようとしている OS のしくみを理解したり、アセンブリ言語に慣れてきたり、いろいろ経験出来てプラスになっているのを実感したりはします。
でも解決できないと意味がない気もします。
早く問題が解決してくれると助かるんですけどねぇ…。
RPG の開発をもう半年くらいやっていない気がするんです。いや、3か月かなぁ…。
「はじめて読む486」という本のサンプルプログラムのソースコードをコンパイル/アセンブルして、実行ファイルを作り、その実行ファイルを実行し、その後 wasm.exe などのプロテクトモードに移行するタイプのアプリを実行すると、そのアプリがフリーズする…という問題ですが、調査して原因が(やっと)分かりました。
CPU 内の特殊なメモリの cr0 という部分(cr0 レジスタ)の、とあるビットがサンプルプログラム実行後に設定したまま?になっていて、これを 0x00000018 から 0x00000010 に直したら、フリーズしないで正常に動くようになりました。
この cr0 にセットされた 0x00000018 の 8 というのは第3ビットが立っている(1である)ということですが、調べてみると、、
(2024年6月29日 追記 いけね、間違えていた…0x8 は第7ビットだと書いていましたが間違いでした…正しくは第3ビットです。…そしてこの記事の内容を直しました)以下 Wikipedia から図で引用…
Bit の 3 は Task switched となっています。その隣の英文、
>Allows saving x87 task context upon a task switch only aftger x87 instruction usedこれを訳すと、
>x87 命令が使用された後にのみタスク切り替え時に x87 タスク コンテキストを保存できるようにします。…意味が分からない…
調べてみると、『CPU がタスク切り替えを行うと、FPU(浮動小数点演算プロセッサ)の状態は切り替え前のままとなる』らしいです。FPU が CPU に対して遅れを取るということです。
『自作OSにおけるFPUの制御』サイト様FPU が CPU についていけていない状態のまま FPU に関する命令を行ってしまうと、CPU と FPU とで食い違いがあるので、「例外INT 0x07が発生する」のだそうです。
「例外INT」とは『予期しない事態が起こったので、プログラム中断=割り込み(interrupt)を行って、対応処理を行う』という意味です。
調べたところによると、その処理のひとつとして、「CLTS*1命令でTSフラグ(第3ビット、TaskSwitched)をクリアする」のだそうです。
そうだ、サンプルプログラムではこの処理を設定していません。
だからタスクスイッチ(切り替え)を行った際に、第3ビットが立ったままとなるわけですね。
はぁ、そういうわけですね。
*1 CLTS は、CLear Task-Switched Flag in CR0 の略です
でも、第3ビット(Task switched)が立ったままだと、他のプロテクトモードに移行するアプリ(wasm.exe 等)にとって、どうして問題となるんでしょうか。 …とりあえず、わからない…
調査に使ってきたシステムの構成は、
ハードウェア: | VirtualBox(エミュレーター) |
OS: | PC-DOS |
コンパイラ: | Open Watcom C コンパイラ |
アセンブラ: | GUI Turbo Assembler |
『この構成のうちどれがおかしいのか、それともサンプルプログラムがおかしいのか…』と思っていましたが、サンプルプログラムの不備だった、と言えそうです。
サンプルプログラムのアセンブリ・ソースコードの SwitchTask という関数で、タスクスイッチが行われる次の行に CLTS 命令を入れて、問題は解決されました。
以上で、「はじめて読む486」という本のサンプルプログラムについての問題は、以下のようにすべて解決されたと思います。
問題 | 対策 | |
---|---|---|
1. | 無料の DOS である FreeDOS はそのままだと一部のサンプルプログラムが動作しない。 | FreeDOS のシステムファイルを FDOS のシステムファイルに差し替える。 |
2. | 上行 1. の対策を行っても、まだ一部動作しない。 | .asm ファイルは、GUI Turbo Assembler を使用してアセンブルする。 |
3. | 上行 2. を行った後、wasm.exe などプロテクトモードに移行するタイプのアプリを起動すると、そのアプリが停止する。 | task_a.asm の TaskSwitch 関数内の jmp の行の次に CLTS 命令を入れる。 |
調査の途中で PC-DOS を購入しましたが、FreeDOS で問題ないと思います。
できれば、Windows 上で動く GUI Turbo Assembler ではなく、DOS 上で動く Turbo Assembler のほうが、DOS 上で完結できるので良いのですが、DOS 版の Turbo Assembler はオークションなどで有料で手に入れるしかないので、現実的には Windows の GUI Turbo Assembler を使うしかないでしょう。
後日、サンプルプログラムを試すための手順を示した新しい記事を書く予定です。
調査が終わって本当に良かった。